//
// Created by XML on 2023/10/9.
// 字符串
#include <stdio.h>
#include <io_utils.h>
#include <string.h>
#include <ctype.h>

// 获取字符串数组的长度
int getLength(char* string){
    int counter = 0;
    // 遍历元素
    // 指针是可以++ -- 做运算
    while (*string){
        string++; // 指针逐个移动
        counter++; // 计数
    }
    return counter;
}

// getLength 和 getLength2是等效的，虽然getLength2的形参是数组类型
// 但在C/C++编译器，数组作为参数传递，会把数组优化成指针，目的是为了高效率，更接近底层
int getLength2(char string[]){
    int counter = 0;
    // 遍历元素
    while (*string){
        string++; // 指针逐个移动
        counter++; // 计数
    }
    return counter;
}

void getLength3(int* length,char string[]){
    int counter = 0;
    // 遍历元素
    while (*string){
        string++; // 指针逐个移动
        counter++; // 计数
    }
    // 将length内存地址指向counter值
    *length = counter;
}

// 定义一个临时temp指针，是为了避免直接操作原指针会有副作用，会改变原来的值
// 如果直接移动src的指针，那么src的值就变成最后指针位置的值
void lower(char *dest, char *src) {
    char * temp = src;
    while (*temp){
        *dest = tolower(*temp);
        // 移动指针位置，目的是为了移动一个存储一个
        dest ++;
        temp ++;

    }
}



int main() {
//    char str[] = {'h', 'z', 'w'};
// 字符串 第一种定义方式，最后元素'\0'是必须的，防止乱码问题，中止不打印系统值
// 这种方式 字符串是在栈空间操作，
    char str[] = {'h', 'z', 'w','\0'};
    PRINT_STRING(str);
    str[2] = 'i';
    PRINT_STRING(str);

     // 《字符串长度》，在现代语言java，js，dart是一个很简单的事，在C则要手动通过指针来计算
    int length = getLength2(str);
    PRINT_INT(length);
//    PRINT_STRING(*str);

    int len;
    // &len 内存地址
    getLength3(&len,str);
    PRINT_INT(len);

    // 第二种定义字符串的方式
    // 会将字符串存储到全局静态空间，不可修改
    char *str2 = "hzw";
//    str2[2] = 'i'; // 会崩溃 ，相对于
    PRINT_STRING(str2);

    // 《字符串包含》 导入string.h 库
    char * h = "h";
   char * pop = strstr(str,h);
    if(pop){
        PRINT_CHAR(*pop);
    }

    // 《字符串小写转换》
    char dest[20]; // 定义长度20的字符数组，用于接收转换后字符
    char *src = "World";
    lower(dest,src);
//    PRINT_CHAR_ARRAY(dest,20);
    PRINT_STRING(dest);
    PRINT_STRING(src);


    return 0;
}

